package marionito.domaine;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;

@Entity
@Table(name = "JOUEURS_PARTIES", schema = "MARIONITO")
@SuppressWarnings("serial")
public class JoueurPartie implements Serializable {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private int id;

	@Transient
	private int score;

	@ManyToOne
	@JoinColumn(name = "PARTIE_ID")
	private Partie partie;

	@Transient
	private List<Jeton> reserve = new ArrayList<Jeton>();

	@OneToMany(cascade = CascadeType.ALL)
	@JoinColumn(name = "JOUEURS_PARTIES_ID")
	private List<Case> listCases = new ArrayList<Case>();

	@ManyToOne
	private Joueur joueur;

	protected JoueurPartie() {
		super();
	}

	public JoueurPartie(Partie partie, Joueur joueur) {
		this.partie = partie;
		this.joueur = joueur;
		for(int i = 1; i <= 36; i++){
			this.listCases.add(new Case(i));
		}
	}

	public int getId() {
		return id;
	}

	public int getScore() {
		return score;
	}

	public Partie getPartie() {
		return partie;
	}

	public List<Jeton> getReserve() {
		return reserve;
	}

	public List<Case> getlistCases() {
		return listCases;
	}

	public Joueur getJoueur() {
		return joueur;
	}

	public void calculerScore() {
		Collections.sort(this.listCases, new Comparator<Case>() {

			@Override
			public int compare(Case c1, Case c2) {
				return c1.getNum() - c2.getNum();
			}
		});

		int scoreMax = 0;
		int valeurDernierJeton = 0;
		int cmp = 0;
		for (Case c : this.listCases) {
			if(c.getJeton() == null){
				continue;
			}
			int valeurJeton = c.getJeton().getValeur();
			if (valeurDernierJeton < valeurJeton) {
				cmp++;
				valeurDernierJeton = valeurJeton;
			} else {
				if (scoreMax < cmp) {
					scoreMax = cmp;
				}
				cmp = 0;
				valeurDernierJeton = 0;
			}
		}

		if (scoreMax < cmp) {
			scoreMax = cmp;
		}

		this.score = scoreMax;
	}

	public boolean ajouterJeton(int num, int valeur) {
		marionito.util.Util.checkPositive(num);
		marionito.util.Util.checkPositive(valeur);

		Iterator<Case> it = this.listCases.iterator();
		while(it.hasNext()){
			Case cas = it.next();
			if(cas.getNum() == num){
				cas.setJeton(new Jeton(valeur));
				return true;
			}
		}		
		return false;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + id;
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		JoueurPartie other = (JoueurPartie) obj;
		if (id != other.id)
			return false;
		return true;
	}

}
